import axios from 'axios'
import qs from 'qs'
import store from '../store/index'
import {getToken} from '../utils/token'
import Code from '../utils/code'
import {Toast} from 'vant'
import router from '../router'
/**
 * 封装通用请求工具类
 */
// let loading
// function startLoading () {
//   loading = Toast.loading({
//     duration: 0,
//     mask: false,
//     message: '加载中...'
//   })
// }
//
// function endLoading () {
//   loading.clear()
// }
/**
 * 跳转登录页
 * 携带当前页面路由，以期在登录页面完成登录后返回当前页面
 */
const toLogin = () => {
  router.replace({
    path: '/login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}

// create an axios instance
const service = axios.create({
  baseURL: process.env.BASE_API_PATH, // api的base_url
  timeout: 5000, // request timeout
  withCredentials: true // 使前台能够保存cookie
})
// 判断是否是formData请求
const isFormData = (v) => {
  return Object.prototype.toString.call(v) === '[object FormData]'
}
// request interceptor
service.interceptors.request.use(config => {
  // startLoading()
  // 在发送请求之前做某件事
  if (!isFormData(config.data) && config.method === 'post') {
    config.data = qs.stringify(config.data)
    // 温馨提示,若是提交能直接接受json 格式,可以不用 qs 来序列化的
  }
  if (store.getters.token) {
    config.headers['Authorization'] = getToken()
    // config.headers['Authorization'] = store.getters.token
  }
  return config
}, error => {
  // Do something with request error
  Promise.reject(error)
})

// respone interceptor
service.interceptors.response.use(
  res => {
    if (!res.data) {
      Promise.reject(new Error('服务器响应超时'))
      return
    }
    switch (res.data.status) {
      // 成功
      case Code.SUCCES:
        return res
      // 失败
      case Code.FAILRE:
        return res
      // 错误
      case Code.ERROR:
        Toast('请求异常')
        break
      // 未登录
      case Code.UNAUTHEN:
        // Toast('登录超时')
        store.dispatch('Logout').then(() => {
          toLogin()
        })
        break
      // 默认
      default:
        Toast('未知状态:' + res.data.status)
    }
    return Promise.reject(res)
  },

  /**
   * 请求发生错误，一般都是服务器抛异常了
   */
  err => {
    if (!err.response) {
      Toast('服务器响应超时')
    } else if (err.response.status) {
      switch (err.response.status) {
        // 404请求不存在
        case 404:
          Toast('接口请求失败')
          break
        case 504:
          Toast('接口请求超时')
          break
        // 其他错误，直接抛出错误提示
        default:
          Toast('接口请求错误')
      }
    }
    // Toast('接口请求失败')
    return Promise.reject(err)
  }
)

/**
 * 封装get方法
 * @param url
 * @param data
 * @returns {Promise}
 */

export function get (url, params = {}) {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: params
    }).then(response => {
      resolve(response.data)
    }).catch(err => {
      reject(err)
    })
  })
}

/**
 * 封装post请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function post (url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.post(url, data).then(response => {
      resolve(response.data)
    }, err => {
      reject(err)
    })
  })
}

/**
 * 封装patch请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function patch (url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.patch(url, data).then(response => {
      resolve(response.data)
    }, err => {
      reject(err)
    })
  })
}

/**
 * 封装put请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function put (url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.put(url, data).then(response => {
      resolve(response.data)
    }, err => {
      reject(err)
    })
  })
}
export default service
